# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)

# 设置编译器
if(CMAKE_HOST_UNIX)
	message("current platform: Linux ")
    set (CMAKE_CXX_COMPILER "/usr/bin/g++")
elseif(CMAKE_HOST_WIN32)
	message("current platform: Windows ")
    set (CMAKE_C_COMPILER "gcc.exe")
else()
	message("current platform: unkonw ")
endif()

# 编译模式() "Debug" "Release" "RelWithDebInfo" "MinSizeRel"
# Debug：-O0 -g                 用于在没有优化的情况下，使用带有调试符号构建库或可执行文件  
# Release：-O3 -DNDEBUG         用于构建的优化的库或可执行文件，不包含调试符号
# RelWithDebInfo：-Os -DNDEBUG  由于构建较少的优化库或可执行文件，包含调试符号
# MinSizeRel：-O2 -g -DNDEBUG   用于不增加目标代码大小的优化方式，来构建或可执行文件
# NDEBUG宏会使assert宏被去除掉（assert宏主要是在调试时使用）
SET(CMAKE_BUILD_TYPE Debug)     

if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()


# 编译选项, 全局
add_compile_options(-Wall -g)
# 编译选项, C or c++
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-variable -g" CACHE STRING "Set C Compiler Flags" FORCE)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

# 添加宏
add_definitions(-DUSED_PLATFORM_LINUX_SIMULATOR)

# 获取当前目录名
STRING( REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})

# 设置项目根目录
set(PROJ_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..)
message("PROJ_ROOT:" ${PROJ_ROOT})

# 项目信息
set(PROJ_NAME ${CURRENT_FOLDER})
message("PROJ_NAME:" ${PROJ_NAME})
project(${PROJ_NAME} LANGUAGES C)

# 添加当前目录下的所有源文件
# 并保存到 SRC_LIST
# 此处必须手动添加每一个源文件, 不能使用 file 函数搜索, 否则会因为递归搜索 build 目录导致报 main() redefintion 错误
set(SRC_LIST "main.c")

# 查找src目录下的所有源文件
# 并保存到变量 SRC_LIST_DIR_SRC
file(GLOB_RECURSE SRC_LIST_DIR_SRC "src/*.c")
list(APPEND SRC_LIST ${SRC_LIST_DIR_SRC})   # 添加到 SRC_LIST

# 添加 osal 库和目录
# 设置OSAL的ROOT路径
set(OSAL_ROOT_DIR ${PROJ_ROOT}/osal)
message("OSAL_ROOT_DIR:" ${OSAL_ROOT_DIR})
include(${PROJECT_SOURCE_DIR}/../../osal/FileLists.cmake)
include_directories(${PROJECT_SOURCE_DIR}/../../osal) 
list(APPEND SRC_LIST ${osal_core_SRCS})   # 添加到 SRC_LIST

# 指定生成目标
message("C_FLAGS:" ${CMAKE_C_FLAGS})
message("CXX_FLAGS:" ${CMAKE_CXX_FLAGS})
message("SRC_LIST:" ${SRC_LIST})
message("PROJECT_BINARY_DIR:" ${PROJECT_BINARY_DIR})
message("PROJECT_SOURCE_DIR:" ${PROJECT_SOURCE_DIR})
add_executable(${PROJ_NAME} ${SRC_LIST})

#添加第三方库
target_link_libraries(${PROJ_NAME} PUBLIC  pthread)

target_include_directories(${PROJECT_NAME} PUBLIC
                           ${PROJECT_BINARY_DIR}
                          )